package com.zhike.service.file;

import java.util.HashMap;
import java.util.Set;
import java.util.HashSet;

import org.liuxp.minioplus.api.StorageService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.zhike.common.conf.IMBaseConf;
import com.zhike.common.constant.Constants;
import com.zhike.common.enums.YesNoEnum;
import com.zhike.common.utils.AliSecurityCheckUtils;
import com.zhike.service.system.ISystemConfigService;

import lombok.extern.slf4j.Slf4j;

/**
 * 图片消息中的图片文件上传处理实现类。
 * <p>
 * <b>说明：</b>本类目前主要适用于各种富客户端上传文件，包括Andriod、iOS设备等，本类
 * 中涉及到的要保存的文件名都假定为已由客户端自行计算并使用该文件的md5码重命名后的文件名，
 * 因而服务端无需再次计算，直接使用即可（从而节省服务端宝贵的计算资源）。也即意味着本类
 * 不适用于Web端，因为一般情况下Web端无法也不适合独立完成文件md5码的计算工作，Web端的文件
 * 上传在RainbowChat中，将使用额外的类和接口，不与APP端混为一谈。
 * 
 * @author Json
 * @since 2.0
 */
@Slf4j
@Component
public class MsgImageUploader extends UploaderRoot {
	@Autowired
	private IMBaseConf baseConf;
	@Autowired
	private StorageService storageService;

	@Autowired
	private ISystemConfigService systemConfigService;

	@Override
	public String getFileSaveDir() {
		return baseConf.getDIR_USER_UPLOAD();
	}

	@Override
	public void onUploadSucess(HashMap<String, Object> parametersFromClient) throws Exception {
		String url = (String) parametersFromClient.get("url");
		String userUid = (String) parametersFromClient.get("user_uid");
		// 因为服务端是支持多文件上传的API，所以客户端单独把文件名带过来了，方便使用！
		String fileName = (String) parametersFromClient.get("file_name");

		if (systemConfigService.getValueByKeyAsInt("securityCheck", "user_profile").equals(YesNoEnum.YES.getValue())) {
			if (StringUtils.isNotBlank(userUid) && StringUtils.isNotBlank(fileName) && StringUtils.isNotBlank(url)) {

				// 校验头像图片是否合规
				if (!AliSecurityCheckUtils.imageScan(url, "baselineCheck")) {
					log.warn("FileKey: {} 不合规", fileName);
					// 删除
					storageService.remove(fileName);
					log.info("uid:{} 图片：{} 不合规已删除", userUid, fileName);
					return;
				}
			}
		}

	}

	@Override
	public void onUploadFailure(Exception ex) {
		log.error("[" + getDebugTAG() + "] 处理图片消息上传时出错了，" + ex.getMessage(), ex);
	}

	@Override
	public String getDebugTAG() {
		return "HTTP图片消息";
	}

	@Override
	public String getPathTag() {
		return Constants.UPLOAD_CHAT + "/images";
	}

	@Override
	public Set<String> getDetectedTypes() {
		Set<String> allowExtensions = new HashSet<>();
		allowExtensions.add("image/png");
		allowExtensions.add("image/jpeg");
		allowExtensions.add("image/jpg");
		allowExtensions.add("image/gif");
		return allowExtensions;
	}
}
